import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }

    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        if (n == 0) return 0;
        int sum = 0;
        int len = Integer.MAX_VALUE;
        for (int left = 0, right = 0; right < n; right++) {
            sum += nums[right];
            while (sum >= target) {
                len = Math.max(len, right - left + 1);
                sum -= nums[left--];
            }
        }
        return len == Integer.MAX_VALUE ? 0 : len;
    }

    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        if (n == 0  || n==1 ) return n;
        int len = Integer.MIN_VALUE;
        HashMap<Character, Integer> map = new HashMap<>();
        for (int left = 0, right = 0; right < n; right++) {
            if (map.containsKey(s.charAt(right))) {
                map.put(s.charAt(right), map.get(s.charAt(right)) + 1);
                while(map.get(s.charAt(right)) > 1) {
                    map.put(s.charAt(left), map.get(s.charAt(left)) - 1);
                    left++;
                }
            }else{
                map.put(s.charAt(right), 1);
            }
            len= Math.max(len, right - left +1);
        }
        return len;
    }
//    public int lengthOfLongestSubstring(String s) {
//        if (s == null || s.length() == 0) {
//            return 0;
//        }
//        HashMap<Character, Integer> map = new HashMap<>();
//        int left = 0;          // 滑动窗口左边界（闭）
//        int maxLen = 0;        // 全局最大长度
//
//        for (int right = 0; right < s.length(); right++) {
//            char c = s.charAt(right);
//            // 如果字符重复且上次出现的位置在窗口内，则收缩左边界
//            if (map.containsKey(c) && map.get(c) >= left) {
//                left = map.get(c) + 1;   // 跳到“上次出现位置+1”
//            }
//            // 更新/插入当前字符的最新位置
//            map.put(c, right);
//            // 计算当前窗口长度并更新最大值
//            maxLen = Math.max(maxLen, right - left + 1);
//        }
//        return maxLen;
//    }
}